import { computed, onUnmounted, unref, watchEffect } from 'vue';
import { useThrottleFn } from '@vueuse/core';

import { useAppStore } from '@/store/modules/app';
import { useLockStore } from '@/store/modules/lock';

import { useUserStore } from '@/store/modules/user';
import { useRootSetting } from '../setting/useRootSetting';

export function useLockPage() {
	const { getLockTime } = useRootSetting();
	const lockStore = useLockStore();
	const userStore = useUserStore();
	const appStore = useAppStore();

	let timeId: TimeoutHandle;

	function clear(): void {
		window.clearTimeout(timeId);
	}

	function resetCalcLockTimeout(): void {
		// not login
		if (!userStore.getToken) {
			clear();
			return;
		}
		const lockTime = appStore.getProjectConfig.lockTime;
		if (!lockTime || lockTime < 1) {
			clear();
			return;
		}
		clear();

		timeId = setTimeout(() => {
			lockPage();
		}, lockTime * 60 * 1000);
	}

	function lockPage(): void {
		lockStore.setLockInfo({
			isLock: true,
			pwd: undefined,
		});
	}

	watchEffect(onClean => {
		if (userStore.getToken) {
			resetCalcLockTimeout();
		} else {
			clear();
		}
		onClean(() => {
			clear();
		});
	});

	onUnmounted(() => {
		clear();
	});

	const keyupFn = useThrottleFn(resetCalcLockTimeout, 2000);

	return computed(() => {
		if (unref(getLockTime)) {
			return { onKeyup: keyupFn, onMousemove: keyupFn };
		} else {
			clear();
			return {};
		}
	});
}
